/*
提交链接：https://leetcode.cn/problems/fruit-into-baskets/submissions/560382273
904. 水果成篮-中等
完成日期：2024/9/1
滑动窗口
*/

class Solution {  
public:  
    int totalFruit(std::vector<int>& fruits) {  
        std::unordered_map<int, int> fruitCount; // 用于记录每种水果的数量  
        int maxFruits = 0; // 最大水果数量  
        int left = 0; // 窗口的左边界  
        for (int right = 0; right < fruits.size(); ++right) {  
            // 扩展窗口的右边界  
            fruitCount[fruits[right]]++;  
            // 当窗口内的水果种类超过两种时，需要移动左边界  
            while (fruitCount.size() > 2) {  
                fruitCount[fruits[left]]--;  
                if (fruitCount[fruits[left]] == 0) {  
                    // 如果窗口内某种水果的数量变为0，则从哈希表中删除该水果  
                    fruitCount.erase(fruits[left]);  
                }  
                left++; // 移动左边界  
            }  
            // 更新最大水果数量  
            maxFruits = std::max(maxFruits, right - left + 1);  
        }  
        return maxFruits;  
    }  
};
